package com.cs.beneficios.business.entity;

//import com.cs.beneficios.business.model.RepAtributoVO;
//import com.cs.beneficios.business.model.RepBeneficioOtorgadoVO;

import com.cs.beneficios.business.model.ReportComunaVO;
//import com.cs.beneficios.business.model.ReporteTotalBeneficiosOtorVO;
import com.cs.beneficios.business.model.ReporteTotalComunaVO;
//import com.cs.beneficios.business.model.VflexVO;
import com.cs.beneficios.common.ConnectionFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collection;
//import java.util.LinkedList;
//import java.util.List;

public class ReporteTotalComunaDAO {
	/**
	 * Conexion a la base de datos.
	 */
	private Connection conn = null;
	private ConnectionFactory cf;

	/**
	 * Constructor que inicializa la conexion con la base de datos.
	 * 
	 * @param conn
	 *            Conexion con la base de datos.
	 */

	public ReporteTotalComunaDAO(ConnectionFactory cf) {
		this.cf = cf;
		try {
			this.conn = this.cf.getConnection();
		} catch (SQLException e) {
		}
	}

	public Collection GetBenBerComuna(ReporteTotalComunaVO criterea)
			throws SQLException {
		// parte adicional de la consulta (criterios de busqueda.)
		StringBuffer queryVars = new StringBuffer();
		StringBuffer sbQueryVars = new StringBuffer();

		if ((Object) criterea.getCodeComuna() != null) {
			queryVars
					.append(" AND comuna.CODIGO = " + criterea.getCodeComuna());
			sbQueryVars.append(" AND comuna_.CODIGO = "
					+ criterea.getCodeComuna());
		}
		if ((Object) criterea.getCodeSubprograma() != null) {
			queryVars.append(" AND subpro.CODIGO = "
					+ criterea.getCodeSubprograma());
			sbQueryVars.append(" AND subpro_.CODIGO = "
					+ criterea.getCodeSubprograma());
		}
		if ((Object) criterea.getCodePrograma() != null) {
			queryVars
					.append(" AND prog.CODIGO = " + criterea.getCodePrograma());
			sbQueryVars.append(" AND prog_.CODIGO = "
					+ criterea.getCodePrograma());
		}
		if ((Object) criterea.getDesde() != null
				&& (Object) criterea.getHasta() != null) {
			queryVars.append(" AND beneotor.FECHA_BENEFICIO between TO_DATE('"
					+ criterea.getDesde() + "','dd/mm/rrrr') and TO_DATE('"
					+ criterea.getHasta() + "','dd/mm/rrrr')");
			sbQueryVars
					.append(" AND beneotor_.FECHA_BENEFICIO between TO_DATE('"
							+ criterea.getDesde()
							+ "','dd/mm/rrrr') and TO_DATE('"
							+ criterea.getHasta() + "','dd/mm/rrrr')");
		}
		if ((Object) criterea.getDesde() != null
				&& (Object) criterea.getHasta() == null) {
			queryVars.append(" AND beneotor.FECHA_BENEFICIO >= TO_DATE('"
					+ criterea.getDesde() + "','dd/mm/rrrr')");
			sbQueryVars.append(" AND beneotor_.FECHA_BENEFICIO >= TO_DATE('"
					+ criterea.getDesde() + "','dd/mm/rrrr')");
		}
		if ((Object) criterea.getDesde() == null
				&& (Object) criterea.getHasta() != null) {
			queryVars.append(" AND beneotor.FECHA_BENEFICIO <= TO_DATE('"
					+ criterea.getHasta() + "','dd/mm/rrrr')");
			sbQueryVars.append(" AND beneotor_.FECHA_BENEFICIO <= TO_DATE('"
					+ criterea.getHasta() + "','dd/mm/rrrr')");
		}

		String query = "SELECT COUNT(DISTINCT beneotor.BEN_CODIGO) contbeneficiario, COUNT(beneotor.CODIGO) contbeneficio, "
				+ "SUM(beneotor.VALOR_BENEFICIO) valor, comuna.NOMBRE nomcomuna, prog.NOMBRE nompro, subpro.NOMBRE nomsubpro "

				// subquery
				+ " , (SELECT COUNT(DISTINCT beneficiario_.codigo) FROM TCS_BEN_PROGRAMA prog_, TCS_BEN_SUBPROGRAMA subpro_, paoyer.TCS_VALOR_FLEXIBLE comuna_, TCS_BEN_BENEFICIO_OTORGADO beneotor_,TCS_BEN_BENEFICIARIO beneficiario_ WHERE beneotor_.SBPR_CODIGO =  subpro_.CODIGO AND subpro_.PRG_CODIGO = prog_.CODIGO AND beneficiario_.CODIGO = beneotor_.BEN_CODIGO AND beneficiario_.VFL_CODIGO_COMUNA = comuna_.CODIGO and prog_.vigencia='A' and subpro_.vigencia='A' "
				+ sbQueryVars.toString()
				+ " ) AS TOTAL_BENEFICIARIOS "

				+ ", area.NOMBRE nombre_secretaria "
				+ "FROM TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA subpro, paoyer.TCS_VALOR_FLEXIBLE comuna, "
				+ "TCS_BEN_BENEFICIO_OTORGADO beneotor,TCS_BEN_BENEFICIARIO beneficiario , TCS_BEN_AREA area "
				+ "WHERE beneotor.SBPR_CODIGO =  subpro.CODIGO "
				+ "AND subpro.PRG_CODIGO = prog.CODIGO "
				+ "AND beneficiario.CODIGO = beneotor.BEN_CODIGO "
				+ "AND beneficiario.VFL_CODIGO_COMUNA = comuna.CODIGO AND subpro.area_codigo = area.codigo AND prog.vigencia='A' and subpro.vigencia='A' ";

		query += queryVars.toString();
		/*
		 * if((Object)criterea.getCodeComuna() != null) { query +=
		 * " and comuna.CODIGO = "+criterea.getCodeComuna(); }
		 * if((Object)criterea.getCodeSubprograma() != null) { query +=
		 * " and subpro.CODIGO = "+criterea.getCodeSubprograma(); }
		 * if((Object)criterea.getCodePrograma() != null) { query +=
		 * " and prog.CODIGO = "+criterea.getCodePrograma(); }
		 * 
		 * if((Object)criterea.getDesde() != null && (Object)criterea.getHasta()
		 * != null) { query +=
		 * "and beneotor.FECHA_BENEFICIO between TO_DATE('"+criterea
		 * .getDesde()+"','dd/mm/rrrr') and TO_DATE('"
		 * +criterea.getHasta()+"','dd/mm/rrrr')"; }
		 * if((Object)criterea.getDesde() != null && (Object)criterea.getHasta()
		 * == null) { query +=
		 * "and beneotor.FECHA_BENEFICIO >= TO_DATE('"+criterea
		 * .getDesde()+"','dd/mm/rrrr')"; } if((Object)criterea.getDesde() ==
		 * null && (Object)criterea.getHasta() != null) { query +=
		 * "and beneotor.FECHA_BENEFICIO <= TO_DATE('"
		 * +criterea.getHasta()+"','dd/mm/rrrr')"; }
		 */
		query += " GROUP BY area.nombre,comuna.NOMBRE,prog.NOMBRE,subpro.NOMBRE ";
		query += " ORDER BY area.nombre,comuna.NOMBRE,prog.NOMBRE,subpro.NOMBRE";

		ResultSet rst = null;
		// System.out.println(query);
		ArrayList lbeneotor = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		ReportComunaVO objbeneficios = null;
		long totalvalor = 0;
		long totalben = 0; // total beneficios
		long totalber = 0; // total beneficiarios
		int firstRow = 0;
		while (rst.next()) {
			objbeneficios = new ReportComunaVO();
			objbeneficios.setNombrePrograma(rst.getString("nompro"));
			objbeneficios.setNombreSubprograma(rst.getString("nomsubpro"));
			objbeneficios.setNombreComuna(rst.getString("nomcomuna"));
			objbeneficios.setContben(rst.getInt("contbeneficio"));
			objbeneficios.setContber(rst.getInt("contbeneficiario"));
			objbeneficios.setValor(rst.getLong("valor"));
			objbeneficios.setNombreSecretaria(rst
					.getString("nombre_secretaria"));
			totalvalor += rst.getLong("valor");

			totalben += rst.getLong("contbeneficio");
			// totalber += rst.getLong("contbeneficiario");

			if (firstRow == 0) {
				totalber = rst.getLong("TOTAL_BENEFICIARIOS");
				firstRow++;
			}

			lbeneotor.add(objbeneficios);

			objbeneficios = null;
		}

		if (lbeneotor.size() > 0) {
			objbeneficios = new ReportComunaVO();
			objbeneficios.setNombreComuna("VALOR TOTAL");
			objbeneficios.setContben(totalben);
			objbeneficios.setContber(totalber);
			objbeneficios.setValor(totalvalor);

			lbeneotor.add(objbeneficios);

			objbeneficios = null;
		}
		rst.close();
		return lbeneotor;
	}

	/************************************************
	 * Metodo para provisional para recuprar los filtros utilizados en el
	 * reporte
	 * *********************************************/
	public ReporteTotalComunaVO getFilters(ReporteTotalComunaVO objRtcVO)
			throws SQLException {
		String strQuery = null;
		ResultSet rst = null;

		if (objRtcVO.getCodeComuna() != null) {
			strQuery = "SELECT NOMBRE" + " FROM PAOYER.TCS_VALOR_FLEXIBLE"
					+ " WHERE CODIGO = " + objRtcVO.getCodeComuna();
			rst = cf.getRecordsRset(strQuery, null, conn);

			rst.next();
			objRtcVO.setNombreComuna(rst.getString("NOMBRE"));
		}
		if (objRtcVO.getCodePrograma() != null) {
			strQuery = "SELECT NOMBRE" + " FROM TCS_BEN_PROGRAMA"
					+ " WHERE CODIGO = " + objRtcVO.getCodePrograma();
			rst = cf.getRecordsRset(strQuery, null, conn);

			rst.next();
			objRtcVO.setNombrePrograma(rst.getString("NOMBRE"));
		}
		if (objRtcVO.getCodeSubprograma() != null) {
			strQuery = "SELECT NOMBRE" + " FROM TCS_BEN_SUBPROGRAMA"
					+ " WHERE CODIGO = " + objRtcVO.getCodeSubprograma();
			rst = cf.getRecordsRset(strQuery, null, conn);

			rst.next();
			objRtcVO.setNombreSubprograma(rst.getString("NOMBRE"));
		}

		if (rst != null)
			rst.close();

		return objRtcVO;
	}

	public Connection getConn() {
		return conn;
	}
}